#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-04-13 23:14
# @Author : youngchaolin

''''''

'''
生成器：
1 在python社区，大部分人把生成器和迭代器看成一个东西，生成器本质上就是迭代器
2 生成器，是自己用python代码构建出的一种数据结构
获取一个生成器的三种方式：
1 生成器函数
2 生成器表达式
3 python内部提供的一些
'''

# 1 生成器函数
def func():
    print('我不是函数，我是生成器')
    yield 520
    print('是否执行')
    yield 1314

ret=func()
print(ret) # <generator object func at 0x105bffcf0>

print(next(ret))
print(next(ret))

'''
return和yield的区别
return：会终止函数，如果有多个return只有一个生效，并且return会返回值给函数的执行者
yield：只要一个函数中有yield，那么它就是生成器函数，并且一个next对应一个yield，执行到函数体哪里也是可以用光标的思想去理解
'''
print('----没有使用生成器----')
def get_eggs():
    li=[]
    for i in range(1,10001,1):
        li.append(f'鸡蛋{i}号')
    print(li)
# 一次性得到10000个鸡蛋
get_eggs()

# 使用生成器函数
def get_eggs_2():
    for i in range(1,10001,1):
        yield f'鸡蛋{i}号'

ret=get_eggs_2()

print('----第一次消费了100个鸡蛋----')
for r in range(1,101,1):
    # 消费了1-100的鸡蛋
    print(next(ret))

# 再执行一次
print('----第二次消费了100个鸡蛋----')
for r in range(1,101,1):
    # 消费了101-200的鸡蛋
    print(next(ret))


# yield
def func():
    li=[1,2,3,4,5]
    yield li
ret=func()
print(next(ret))

# yield from
def func():
    li=[1,2,3,4,5]
    # 类似写了5个yield
    yield from li
ret=func()
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))
print(next(ret))

def func():
    l1=['messi','herry','ronald']
    l2=['梅西','亨利','罗纳尔多']
    yield from l1
    yield from l2

ret=func()
# TODO i就是next(ret)？
# print(ret,type(ret))
for i in ret:
    print(i,type(i))


# 2 TODO 生成器表达式
# 3 TODO python内部提供的一些生成器
